package com.sun.jdk.date.jdk8after;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;

public class TemporalAdjusterPractise {

    /**
     * 自定义TemporalAdjuster调节器
     *
     * 通过Java8本身提供的TemporalAdjusters中的方法可以完成一些常用的操作，如果要自定义日期时间的更改逻辑，可以通过实现TemporalAdjuster类接口的方式来完成。
     * <p>
     * 1、创建类实现TemporalAdjuster接口
     * <p>
     * 2、实现TemporalAdjuster中的 adjusterInto()方法，传入一个日期时间对象，完成逻辑之后返回日期事件对象。
     * <p>
     * 3、通过with方法传入自定义调节器对象完成更改。
     * <p>
     * 例如：假如员工一个月中领取工资，发薪日是每个月的15日，如果发薪日是周末，则调整为周五。
     * <p>
     * 作者：一双看向未来的眼睛
     * 链接：https://www.jianshu.com/p/7a1b367ae95f
     * 来源：简书
     * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
     */
    private static void test1() {
        // 1. 传入进来一个日期时间对象
        LocalDate payDay = LocalDate.of(2018, Month.DECEMBER, 15);

        // 2 计算实际发薪日
        LocalDate realPayDay = LocalDate.from(new PayDayAdjuster().adjustInto(payDay));

        // 3. 预计发薪日
        System.out.println("预计发薪日："+payDay);
        // 4. 真是地发薪日
        System.out.println("真实地发薪日："+realPayDay);
    }

    public static void main(String[] args) {
        test1();
    }
}

class PayDayAdjuster implements TemporalAdjuster {

    @Override
    public Temporal adjustInto(Temporal temporal) {
        LocalDate payDay = LocalDate.from(temporal);
        // 判断当前封装的时间中的日期是否为15号，如果不是，则修改为15号
        int day = payDay.getDayOfMonth() != 15 ? 15 : payDay.getDayOfMonth();
        LocalDate realPayDay = payDay.withDayOfMonth(day);
        // LocalDate realPayDay = payDay.withDayOfMonth(15);
        // 判断realPayDay封装的日期是否为周六或周日,如果是，则改为上一个周五
        if (realPayDay.getDayOfWeek() == DayOfWeek.SUNDAY || realPayDay.getDayOfWeek() == DayOfWeek.SATURDAY) {
            realPayDay = realPayDay.with(TemporalAdjusters.previous(DayOfWeek.FRIDAY));
        }
        return realPayDay;
    }
}
